/*
  学习目标：指定详细的泛型类型
  总结：泛型T，代表捕获的任意类型， 可以和其它类型组合使用 T[] {name: T}
*/

// 需求1： 接收数组，返回数组第一项元素的类型
type FindFirstFn = <T>(arr: T[]) => T;

const findFirstFn: FindFirstFn = (arr) => arr[0];
const result1 = findFirstFn([1]); //  期望返回类型为number
result1.toFixed(2);
const result2 = findFirstFn(['1']); // 期望返回类型为string
result2.startsWith('.');
const result5 = findFirstFn(['1', 5, true]); // 期望返回类型为string

// 需求2： 接收对象，返回对象的name属性的值类型
type FindNameFn = <T>(obj: { name: T }) => T;
const findNameFn: FindNameFn = (obj) => obj.name;
const result3 = findNameFn({ name: '123' }); //返回值类型string
const result4 = findNameFn({ name: 123 }); //返回值类型number
